package com.yc.spring.aop;

import com.yc.spring.bbs.dao.UserDao;
import com.yc.spring.bbs.dao.UserDaoImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

// java官方提供的代理方式, 基于接口方式实现, 被代理类必须实现接口
public class JdkProxy {

    public static Object proxy(Object bean){
        return Proxy.newProxyInstance(
                // 类加载器
                bean.getClass().getClassLoader(),
                // 接口数组
                bean.getClass().getInterfaces(),
                // 方法拦截器, 匿名类
                new InvocationHandler() {
                    @Override
                    public Object invoke(
                            Object proxy, // 代理对象
                            Method method, // 拦截到的方法
                            Object[] args  // 传入方法的参数
                    ) throws Throwable {
                        // 执行业务方法
                        System.out.println("前置增强 method = " + method);
                        Object ret = method.invoke(bean, args);
                        return ret;
                    }
                }
        );
    }

    public static void main(String[] args) {
        UserDao userDao = new UserDaoImpl();
        UserDao proxyBean = (UserDao) proxy(userDao);
        proxyBean.insert(null);
    }

    // public abstract void com.yc.spring.bbs.dao.BaseDao.insert(java.lang.Object)

}
